//定义Vuex的源码实现效果操作，基础版本实现

//定义Vue对象
let Vue;
class Store {
    //定义构造函数，实例化时候触发
    constructor(options) {
        //初始化数据
        this.$options = options;
        //定义Vuex中的五大核心数据的赋值，state数据是响应式数据
        this._vm = new Vue({
            data: {
                $state: options.state,
            }
        })
        //把Vuex中的核心方法和异步方法挪过来赋值
        this._mutations = options.mutations;
        this._actions = options.actions;

        //绑定修改state数据的两个方法，commit，dispatch实现,改变this指向
        this.commit = this.commit.bind(this);
        this.dispatch = this.dispatch.bind(this);
    }
    //返回数据，直接返回state数据进行数据过滤，class类中的设置set和get方法， 参考ts的class类
    get state(){
        console.log("获取数据",this._vm);
        return this._vm._data.$state;
    }
    set state(val){
        console.log(val);
        console.error("不能直接修改state数据，请慎重");
        return ;
    }

    //实现dispatch和commit方法的操作
    commit(type,payload){
        //判断类型是否存在
        let entry = this._mutations[type];
        if(!entry){
            console.error(`${type} is not found in mutations functions`);
            return;
        }
        //调用方法
        entry(this.state,payload);
    }

    dispatch(type,payload){
        //判断方法是否存在
        let entry = this._actions[type];

        if(!entry){
            console.error(`${type} is not found in actions functions`);
            return;
        }

        entry(this,payload);
    }
}
//定义install方法，完成插件的安装
let install = function(_Vue){

    //初始化数据操作
    Vue = _Vue;

    //全局混入定义Vuex挂载的信息
    Vue.mixin({
        beforeCreate() {
            if(this.$options.store){
                //全局挂载数据赋值
                Vue.prototype.$store = this.$options.store;
            }
        },
    })
}
export default {Store,install};